﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Administration.Entities;
using HerGoS.DAO;
using HerGoS.Interfaces;
using System.Data;
using HerGoS.Administration.Exceptions;

namespace HerGoS.Administration.Engine
{
    public class GestorContrato
    {

        public static Contrato Obtener(int oid)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "CONTRATOS_SP";
                repo.AddParameter("@ACCION", "BYID");
                repo.AddParameter("@ID", oid);
                DataTable dt = repo.ExecuteDataTable();
                Contrato result = dt.ToGenericList<Contrato>(ContratoConverter).FirstOrDefault();
                return result;
            }
            catch (Exception ex)
            {
                throw new ContratosGetException(ex);
            }
        }


        /// Guarda un contacto relacionado a una entidad
        /// </summary>
        /// <param name="contacto">Contacto</param>
        /// <param name="entidad">Entidad</param>
        public static void Guardar(Contrato contrato, IContratos entidad)
        {
            try
            {
                IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryName);
                repo.Nombre = "CONTRATOS_PROC";
                repo.AddParameter("@ACCION", contrato.Persistencia);
                repo.AddParameter("@ID", contrato.OID);
                repo.AddParameter("@ENTIDAD", (entidad != null) ? entidad.GetType().Name : null);
                repo.AddParameter("@IDREGISTRO", (entidad != null) ? entidad.OID : 0);
                repo.AddParameter("@IDTIPOCONTRACTO", contrato.TipoContrato.OID);
                repo.AddParameter("@MONTO", contrato.Monto);
                repo.AddParameter("@OBJETIVOS", contrato.Objetivos);
                repo.AddParameter("@CodigoPOA", contrato.CodigoPOA);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                contrato.OID = repo.ExecuteReturnValue().ToInteger();
                repo.Commit();

             
            }
            catch (Exception ex)
            {
                throw new ContratosSaveException(ex);
            }
        }


        /// <summary>
        /// Guarda una lista de contratos relacionada a una entidad
        /// </summary>
        /// <param name="contactos">Lista de contratos</param>
        /// <param name="entidad">Entidad</param>
        public static void Guardar(List<Contrato> contratos, IContratos entidad)
        {
           contratos.ForEach(x => Guardar(x, entidad));
        }



        /// <summary>
        /// Guarda una lista de contacto relacionada a una entidad que implementa IContactos
        /// </summary>
        /// <param name="contactos">Lista de contactos</param>
        /// <param name="entidad">Entidad</param>
        public static void Guardar(IContratos entidad)
        {
            foreach (Contrato c in entidad.Contratos)
            {
                Guardar(c, entidad);
            }
        }

        /// <summary>
        /// Elimina un contacto
        /// </summary>
        /// <param name="contacto">Contacto</param>
        public static void Eliminar(Contrato contrato)
        {
            contrato.Persistencia = EstadoPersistencia.DELETE;
            Guardar(contrato, null);
        }

        /// <summary>
        /// Permite consultar los contratos de una entidad
        /// </summary>
        /// <param name="entidad">Entidad consultada</param>
        /// <returns>Todos los contratos de la entidad</returns>
        public static List<Contrato> Consultar(IContratos entidad)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "CONTRATOS_SP";
                repo.AddParameter("@ACCION", "CONSULTA");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@ENTIDAD", entidad.GetType().Name);
                repo.AddParameter("@IDREGISTRO", entidad.OID);
                DataTable dt = repo.ExecuteDataTable();
                List<Contrato> result = dt.ToGenericList<Contrato>(ContratoConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new ContratosGetException(ex);
            }
        }

        public static List<Contrato> Activos(IContratos entidad)
        {
            try
            {
                return entidad.Contratos.Where(x => x.Persistencia != EstadoPersistencia.DELETE).ToList();

            }
            catch (Exception ex)
            {
                throw new ContratosGetException(ex);
            }

        }
        #region Converter
        public static Contrato ContratoConverter(DataRow row)
        {
            return new Contrato
            {
                OID = row["contID"].ToInteger(),
                TipoContrato = GestorTipoContrato.Obtener(row["contIDTIPO"].ToInteger()),
                Monto = row["contMonto"].ToDecimal(),
                Objetivos = row["contObjetivos"].ToString(),
                CodigoPOA = row["contCodigoPOA"].ToString(),
                Persistencia = EstadoPersistencia.UPDATE
            };
        }
        #endregion

    }
}
